bleh
[mqlkit.git] / MACD Sample.mq4
blob28e47534a8f95019058b41615acd6fe59a3e99cd
1 //+------------------------------------------------------------------+\r
2 //|                                                  MACD Sample.mq4 |\r
3 //|                      Copyright © 2005, MetaQuotes Software Corp. |\r
4 //|                                       http://www.metaquotes.net/ |\r
5 //+------------------------------------------------------------------+\r
6 \r
7 extern double TakeProfit = 50;\r
8 extern double Lots = 0.1;\r
9 extern double TrailingStop = 30;\r
10 extern double MACDOpenLevel=3;\r
11 extern double MACDCloseLevel=2;\r
12 extern double MATrendPeriod=26;\r
14 //+------------------------------------------------------------------+\r
15 //|                                                                  |\r
16 //+------------------------------------------------------------------+\r
17 int start()\r
18   {\r
19    double MacdCurrent, MacdPrevious, SignalCurrent;\r
20    double SignalPrevious, MaCurrent, MaPrevious;\r
21    int cnt, ticket, total;\r
22 // initial data checks\r
23 // it is important to make sure that the expert works with a normal\r
24 // chart and the user did not make any mistakes setting external \r
25 // variables (Lots, StopLoss, TakeProfit, \r
26 // TrailingStop) in our case, we check TakeProfit\r
27 // on a chart of less than 100 bars\r
28    if(Bars<100)\r
29      {\r
30       Print("bars less than 100");\r
31       return(0);  \r
32      }\r
33    if(TakeProfit<10)\r
34      {\r
35       Print("TakeProfit less than 10");\r
36       return(0);  // check TakeProfit\r
37      }\r
38 // to simplify the coding and speed up access\r
39 // data are put into internal variables\r
40    MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);\r
41    MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);\r
42    SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);\r
43    SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);\r
44    MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);\r
45    MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);\r
47    total=OrdersTotal();\r
48    if(total<1) \r
49      {\r
50       // no opened orders identified\r
51       if(AccountFreeMargin()<(1000*Lots))\r
52         {\r
53          Print("We have no money. Free Margin = ", AccountFreeMargin());\r
54          return(0);  \r
55         }\r
56       // check for long position (BUY) possibility\r
57       if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&\r
58          MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)\r
59         {\r
60          ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);\r
61          if(ticket>0)\r
62            {\r
63             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());\r
64            }\r
65          else Print("Error opening BUY order : ",GetLastError()); \r
66          return(0); \r
67         }\r
68       // check for short position (SELL) possibility\r
69       if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && \r
70          MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)\r
71         {\r
72          ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);\r
73          if(ticket>0)\r
74            {\r
75             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());\r
76            }\r
77          else Print("Error opening SELL order : ",GetLastError()); \r
78          return(0); \r
79         }\r
80       return(0);\r
81      }\r
82    // it is important to enter the market correctly, \r
83    // but it is more important to exit it correctly...   \r
84    for(cnt=0;cnt<total;cnt++)\r
85      {\r
86       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);\r
87       if(OrderType()<=OP_SELL &&   // check for opened position \r
88          OrderSymbol()==Symbol())  // check for symbol\r
89         {\r
90          if(OrderType()==OP_BUY)   // long position is opened\r
91            {\r
92             // should it be closed?\r
93             if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&\r
94                MacdCurrent>(MACDCloseLevel*Point))\r
95                 {\r
96                  OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position\r
97                  return(0); // exit\r
98                 }\r
99             // check for trailing stop\r
100             if(TrailingStop>0)  \r
101               {                 \r
102                if(Bid-OrderOpenPrice()>Point*TrailingStop)\r
103                  {\r
104                   if(OrderStopLoss()<Bid-Point*TrailingStop)\r
105                     {\r
106                      OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);\r
107                      return(0);\r
108                     }\r
109                  }\r
110               }\r
111            }\r
112          else // go to short position\r
113            {\r
114             // should it be closed?\r
115             if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&\r
116                MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))\r
117               {\r
118                OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position\r
119                return(0); // exit\r
120               }\r
121             // check for trailing stop\r
122             if(TrailingStop>0)  \r
123               {                 \r
124                if((OrderOpenPrice()-Ask)>(Point*TrailingStop))\r
125                  {\r
126                   if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))\r
127                     {\r
128                      OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);\r
129                      return(0);\r
130                     }\r
131                  }\r
132               }\r
133            }\r
134         }\r
135      }\r
136    return(0);\r
137   }\r
138 // the end.